all repos — caroster @ e5ab2b72830ceac154edfa35c7106a508edebebc

[Octree] Group carpool to your event https://caroster.io

frontend/pages/api/nauth/[...nextauth].js (view raw)

  1import NextAuth from 'next-auth';
  2import CredentialsProvider from 'next-auth/providers/credentials';
  3import GoogleProvider from 'next-auth/providers/google';
  4
  5const {STRAPI_URL = 'http://localhost:1337'} = process.env;
  6
  7const authHandler = NextAuth({
  8  providers: [
  9    CredentialsProvider({
 10      name: 'magic-link',
 11      credentials: {
 12        token: {label: 'Token', type: 'password'},
 13      },
 14      async authorize(credentials) {
 15        console.log({credentials});
 16        const response = await fetch(`${STRAPI_URL}/api/auth/magic-link`, {
 17          method: 'POST',
 18          headers: {'Content-Type': 'application/json'},
 19          body: JSON.stringify({
 20            token: credentials.token,
 21          }),
 22        });
 23        const data = await response.json();
 24        if (!data?.jwt) return null;
 25        else {
 26          const {user, jwt} = data;
 27          return {...user, jwt};
 28        }
 29      },
 30    }),
 31    GoogleProvider({
 32      clientId: process.env.GOOGLE_CLIENT_ID,
 33      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
 34    }),
 35  ],
 36  session: {
 37    jwt: true,
 38  },
 39  callbacks: {
 40    jwt: async params => {
 41      const {token, user, account} = params;
 42
 43      // Google Auth
 44      if (account?.provider === 'google') {
 45        const response = await fetch(
 46          `${STRAPI_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`
 47        );
 48        const data = await response.json();
 49
 50        if (data.error) {
 51          console.error(
 52            `Error from Strapi on authentication with Google: `,
 53            data.error
 54          );
 55          throw new Error(data.error?.message || data.error);
 56        }
 57
 58        token.id = data.user.id;
 59        token.jwt = data.jwt;
 60        token.email = data.user.email;
 61        token.username = data.user.name;
 62        token.lang = data.user.lang?.toLowerCase();
 63        token.provider = account.provider;
 64      }
 65
 66      // Strapi Auth
 67      else if (user) {
 68        token.id = user.id;
 69        token.jwt = user.jwt;
 70        token.email = user.email;
 71        token.username = user.firstname;
 72        token.lang = user.lang?.toLowerCase();
 73        token.provider = account.provider;
 74      }
 75
 76      return token;
 77    },
 78    session: async params => {
 79      const {session, token} = params;
 80      if (session) {
 81        try {
 82          const response = await fetch(`${STRAPI_URL}/api/users/me`, {
 83            headers: {
 84              'Content-Type': 'application/json',
 85              Authorization: `Bearer ${token.jwt}`,
 86            },
 87          });
 88          const profile = await response.json();
 89          session.profile = profile;
 90        } catch (error) {
 91          console.error(error);
 92        }
 93
 94        session.token = token;
 95        session.user.name = token.username;
 96        session.user.lang = token.lang;
 97      }
 98      return session;
 99    },
100  },
101  pages: {
102    signIn: '/auth/login',
103    error: '/auth/login',
104  },
105});
106
107export default async function handler(...params) {
108  await authHandler(...params);
109}